﻿// Форма с расположенным на ней редактором текста с IntelliSense
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Eco.ObjectRepresentation;
using Eco.Services;
using Descriptions_DomainModel.Model;

namespace Plugins.IntelliSense
{
    /// <summary>
    /// Форма с расположенным на ней редактором текста с IntelliSense
    /// </summary>
    public partial class IntelliSenseTextEditorForm : Form
    {
        #region Private fields
        /// <summary>
        /// Ссылка на поставщик сервисов, обычно EcoSpace
        /// </summary>
        private IEcoServiceProvider serviceProvider = null;
        /// <summary>
        /// Реультат открытия окна редактора. Заполняется при закрытии окна
        /// </summary>
        private DialogResult result = DialogResult.Cancel;

        #endregion
        /// <summary>
        /// Инициализация
        /// </summary>
        /// <param name="serviceProvider">Поставщик сервисов, обычно EcoSpace</param>
        public IntelliSenseTextEditorForm(IEcoServiceProvider serviceProvider)
        {
            if (serviceProvider == null)
                throw new NullReferenceException("ServiceProvider cannot be null!");
            InitializeComponent();

            this.serviceProvider = serviceProvider;
        }

        /// <summary>
        /// Показать окно в модальном виде. В редакторе будет находиться указанный текст
        /// </summary>
        /// <param name="text">
        /// Текст, который будет находиться в редакторе
        /// </param>
        /// <param name="domainModel">
        /// Описание оборудования. Служит источником возможных 
        /// идентификаторов для автодополнения
        /// </param>
        /// <param name="variables">
        /// Список имён переменных, они будут использованы для автодополнения
        /// </param>
        /// <returns>
        /// Изменённый текст.
        /// <remarks>
        /// Если окно было закрыто по клавише "Отмена" или "Х",
        /// то текст будет соатвлен без изменений
        /// </remarks>
        /// </returns>
        public string ShowDialog(string text, DomainModel domainModel, IList<string> variables)
        {
            editor.Text = text;

            if (domainModel != null)
                editor.Initialize(
                        serviceProvider,
                        domainModel,
                        this,
                        variables);
            else
                editor.Enabled = false;

            ShowDialog();
            switch (result)
            { 
                case DialogResult.OK :
                    return editor.Text;
                case DialogResult.Cancel :
                default :
                    return text;
            }
        }

        #region Private members
        /// <summary>
        /// Принять введенные данные и закрыть
        /// </summary>
        private void Accept()
        {
            result = DialogResult.OK;
            Close();
        }
        /// <summary>
        /// Отклонить введенные данные и закрыть
        /// </summary>
        private void Decline()
        {
            result = DialogResult.Cancel;
            Close();
        }

        #endregion

        #region Event handlers
        /// <summary>
        /// При нажатии на ОК
        /// </summary>
        /// <param name="sender">-</param>
        /// <param name="e">-</param>
        private void OkButton_Click(object sender, EventArgs e)
        {
            Accept();
        }
        /// <summary>
        /// При нажатии на Отмену
        /// </summary>
        /// <param name="sender">-</param>
        /// <param name="e">-</param>
        private void CancelButton_Click(object sender, EventArgs e)
        {
            Decline();
        }
        /// <summary>
        /// Обработчик нажатия пользователем кнопок на форме редактора
        /// </summary>
        /// <param name="sender">-</param>
        /// <param name="e">-</param>
        private void Editor_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Control && (e.KeyCode == Keys.Enter))
            {
                Accept();
            }
        }

        #endregion
    }
}
